/** 
 * @addtogroup hft
 * hft
 * @brief 鸿泉下线检测消息管理器
 * 
 * 本文件接口提供了下线检测协议消息管理器，主要管理控制、查询、通用应答三个命令。
 * 对于其他命令，可以通过广播接口外部实现，也可以后续集成到本管理器。
 *
 * @code{c}
 * // 获取一段数据流
 * // ....
 * THftMsgMgr mgr;         
 * THftCmdCtrl g_ctrl_;   // 已经创建完成 参见hft_cmd_control.h用例
 * THftCmdQuery g_query_; // 已经创建完成 参见hft_cmd_query.h用例 
 * 
 * // 扩展对象
 * typedef struct TUserBroadcastTag TUserBroadcast;
 * 
 * TUserBroadcast g_broadcast_;
 * 
 * // 广播事件 用户扩展命令
 * Int32 TUserBroadcastProc(THftCmdCtrl *self, const THtpMsg *msg, Byte *dest_buf, Int32 buf_size)
 * {
 *      switch (msg->cmd)
 *      {
 *      case kHtpCmdXferFileData: break; // 自行扩展
 *      }
 * }
 * 
 * // 创建管理器
 * THftMsgMgrCreate(&mgr)
 * 
 * // 管理器加入查询处理功能
 * THftMsgMgrSetQuery(&mgr, &g_query_, THftCmdQueryProc);
 * 
 * // 管理器加入控制处理功能
 * THftMsgMgrSetCtrl(&mgr, &g_ctrl_, THftCmdCtrlProc);
 * 
 * // 管理器加入广播处理功能
 * THftMsgMgrSetBroadcast(&mgr, &g_broadcast_, TUserBroadcastProc);
 * 
 * @endcode
 * 
 * @{
 *
 * @file         hft_msg_mgr.h
 * @brief        下线检测消息管理器
 * @note    
 * @author       lixinliang
 * @date         2020-08-23
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-08-23  <td>1.0                   <td>lixinliang      <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _HFT_MSG_MGR_H_
#define _HFT_MSG_MGR_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_object.h"
#include "ofc/ofc_list.h"

#include "hft/hft_cmd_control.h"
#include "hft/hft_cmd_query.h"

#include "hft/hft_proto.h"

#ifdef __cplusplus
extern "C" {
#endif
    
/**
 * 命令处理事件
 * @param sender: 事件发起者
 * @param msg: 待处理的消息
 * @param dst_buf: 返回消息编码缓存 外部传入
 * @param buf_size: 返回消息缓存长度
 * @param 返回消息实际长度
 */
typedef Int32 (*THfpCmdDoProcEvent)(void *sender, THtpMsg *msg, Byte *dst_buf, Int32 buf_size);

/**
 * 命令处理事件
 */
typedef struct THfpCmdOnProcEventTag THfpCmdOnProcEvent;
struct THfpCmdOnProcEventTag
{
    void               *object; ///< 处理对象
    THfpCmdDoProcEvent Method;  ///< 处理方法
};

/**
 * Hft 消息管理器
 */
typedef struct THftMsgMgrTag THftMsgMgr;
struct THftMsgMgrTag
{
PRIVATE
    THfpCmdOnProcEvent query_event_;     ///< 查询事件
    THfpCmdOnProcEvent ctrl_event_;      ///< 控制事件
    THfpCmdOnProcEvent broadcast_event_; ///< 广播事件
};

/**
 * 构造函数
 * @param self: 对象指针 
 * @return 
 */
void THftMsgMgrCreate(THftMsgMgr *self);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void THftMsgMgrDestroy(THftMsgMgr *self);

/**
 * 注册查询事件
 * @param self: 对象指针
 * @param object: 操作对象(sender)
 * @param method: 操作方法
 * @return True:注册成功 False:注册失败
 */
Bool THftMsgMgrSetQuery(THftMsgMgr *self, void *object, THfpCmdDoProcEvent method);

/**
 * 注册控制事件
 * @param self: 对象指针
 * @param object: 操作对象(sender)
 * @param method: 操作方法
 * @return True:注册成功 False:注册失败
 */
Bool THftMsgMgrSetCtrl(THftMsgMgr *self, void *object, THfpCmdDoProcEvent method);

/**
 * 注册广播事件
 * @param self: 对象指针
 * @param object: 广播操作对象(sender)
 * @param method: 广播操作方法
 * @return True:注册成功 False:注册失败
 */
Bool THftMsgMgrSetBroadcast(THftMsgMgr *self, void *object, THfpCmdDoProcEvent method);

/**
 * 消息处理
 * @param self: 对象指针
 * @param msg:  消息
 * @param ack_buf:  应答缓存
 * @param ack_buf_len:  应答消息长度
 * @return -1:失败 大于0: 应答消息长度
 */
Int32 THftMsgMgrMsgProc(THftMsgMgr *self, THtpMsg *msg, Byte *ack_buf, Int32 ack_buf_len);

#ifdef __cplusplus
}
#endif

#endif // _HFT_MSG_MGR_H_
/** @} */
